﻿// 通信线路.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//


/*

https://www.acwing.com/problem/content/342/
在郊区有 N 座通信基站，P 条 双向 电缆，第 i 条电缆连接基站 Ai 和 Bi。

特别地，1 号基站是通信公司的总站，N 号基站位于一座农场中。

现在，农场主希望对通信线路进行升级，其中升级第 i 条电缆需要花费 Li。

电话公司正在举行优惠活动。

农产主可以指定一条从 1 号基站到 N 号基站的路径，并指定路径上不超过 K 条电缆，由电话公司免费提供升级服务。

农场主只需要支付在该路径上剩余的电缆中，升级价格最贵的那条电缆的花费即可。

求至少用多少钱可以完成升级。

输入格式
第 1 行：三个整数 N，P，K。

第 2..P+1 行：第 i+1 行包含三个整数 Ai,Bi,Li。

输出格式
包含一个整数表示最少花费。

若 1 号基站与 N 号基站之间不存在路径，则输出 −1。

数据范围
0≤K<N≤1000,
1≤P≤10000,
1≤Li≤1000000
输入样例：
5 7 1
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6
输出样例：
4



6 4 1
6 4 1
3 6 7
3 2 4
6 2 5
*/


#include <iostream>
#include <algorithm>
#include <queue>
#include <memory.h>
using  namespace std;

typedef pair<int, int> PII;
const int N = 1010;
const int M = 20010;
int h[N], e[M], ne[M], w[M], idx;
int dist[N];
int st[N];
int n, m, k;

//二分线段费用 大于这个费用就是1  小于这个费用就是0 
//求最短路  然后看n的最短路径是否为k 那么费用就是这个值

void add(int a, int b, int l) {
	e[idx] = b, w[idx] = l, ne[idx] = h[a], h[a] = idx++;
}

bool check(int limit) {
	memset(dist, 0x3f, sizeof dist);
	memset(st, 0, sizeof st);

	dist[1] = 0;
	priority_queue<PII, vector<PII>, greater<PII>> heap;
	heap.push({ 0, 1 });      // first存储距离，second存储节点编号

	while (heap.size())
	{
		auto t = heap.top();
		heap.pop();

		int ver = t.second, distance = t.first;

		if (st[ver]) continue;
		st[ver] = true;

		for (int i = h[ver]; i != -1; i = ne[i])
		{
			int j = e[i]; int len = 1;
			if (w[i] <= limit) len =0; // 费用大于限制就不考虑了
			if (dist[j] > distance +len)
			{
				dist[j] = distance + len;
				heap.push({ dist[j], j });
			}
		}
	}

	return dist[n] <= k;
}

int main()
{
	memset(h, -1, sizeof h);
	cin >> n >> m >> k;
	for (int i = 0; i < m; i++) {
		int a, b, l; cin >> a >> b >> l;
		add(a, b, l); add(b, a, l);
	}

	int l = 0; int r = 1000001;
	while (l < r) {
		int mid = (l + r) >> 1;
		if (check(mid)) {
			r = mid;
		}
		else {
			
			l = mid + 1;
		}
	}
	if (l == 1000001) l = -1;
	cout << l << endl;
	
	return 0;
}

 